package com.dingding.util;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.Consts;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSONObject;
import com.dingding.baseservice.amap.common.AmapConfig;

/**
 * 
 * @ClassName: GetDistanceUtil 
 * @Description: 经纬度转换成距离工具类
 * @author cheshaowei
 * @date 2015-10-9 下午04:51:51
 */
public class GetDistanceUtil extends AmapConfig {

	private static Logger log = Logger.getLogger(GetDistanceUtil.class);

	private static final double EARTH_RADIUS = 6378137;

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

	/**
	 * 根据两点间经纬度坐标（double值），计算两点间距离，单位为千米
	 * 
	 * @param lng1	1点经度
	 * @param lat1	1点纬度
	 * @param lng2	2点经度
	 * @param lat2	2点纬度
	 * @return
	 */
	public static double GetDistance(double lng1, double lat1, double lng2, double lat2) {
		// 将1点的纬度转为度
		double radLat1 = rad(lat1);
		// 将2点的纬度转为度
		double radLat2 = rad(lat2);
		// 计算1点与2点的度差(纬度)
		double a = radLat1 - radLat2;
		// 计算1点与2点的度差(经度)
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(
				Math.pow(Math.sin(a / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		// 四舍五入，保留到米
		s = Math.round(s * 10000) / 10000;
		// 将米转为千米
		s = s / 1000;
		return s;
	}

	/**
	 * @Title: getSingleDistance
	 * @Description: 根据两点的经纬度获取下单距离（下单获取距离）
	 * @author yuHaiQing
	 * @return int    返回类型
	 * @throws
	 */
	public static double getSingleDistance(double lng1, double lat1, double lng2, double lat2) {

		// 两点之前的乘车距离
		double distance = 0;

		CloseableHttpClient client = HttpClients.createDefault();

		// 请求地址
		String url = "http://restapi.amap.com/v3/direction/driving";

		// 创建HTTPPost对象
		HttpPost httpPost = new HttpPost(url);

		// 对请求参数进行封装
		List<NameValuePair> params = new ArrayList<NameValuePair>();

		// 出发点，经度在前，纬度在后，经度和纬度用","分割，经纬度小数点后不得超过6位。
		params.add(new BasicNameValuePair("origin", lng1 + "," + lat1));
		// 目的地，经度在前，纬度在后，经度和纬度用","分割，经纬度小数点后不得超过6位。
		params.add(new BasicNameValuePair("destination", lng2 + "," + lat2));
		// 返回结果详略: base:返回基本信息；all：返回全部信息
		params.add(new BasicNameValuePair("extensions", "all"));
		// 返回数据格式类型(json、xml)
		params.add(new BasicNameValuePair("output", "json"));
		// 驾车选择策略 0.速度优先（时间）1.费用优先（不走收费路段的最快道路） 2.距离优先 3.不走快速路 4.躲避拥堵
		// 5.多策略（同时使用速度优先、费用优先、距离优先三个策略计算路径） 6.不走高速 7.不走高速且避免收费 8.躲避收费和拥堵
		// 9.不走高速且躲避收费和拥堵
		params.add(new BasicNameValuePair("strategy", AmapConfig.STRATEGY));
		// 用户唯一标识
		params.add(new BasicNameValuePair("key", AmapConfig.ACCESS_KEY));

		try {
			// 添加请求参数到请求对象
			httpPost.setEntity(new UrlEncodedFormEntity(params, Consts.UTF_8));

			// 执行http请求
			CloseableHttpResponse httpResponse = client.execute(httpPost);

			// 如果状态码为200 ok
			if (httpResponse.getStatusLine().getStatusCode() == 200) {

				// 读取返回的数据
				String strResult = EntityUtils.toString(httpResponse.getEntity());

				// 将string转为json
				JSONObject jsonObject = JSONObject.parseObject(strResult);

				// 获取两点之间的距离（驾车最近距离 单位：千米）
				distance = jsonObject.getJSONObject("route").getJSONArray("paths").getJSONObject(0)
						.getDouble("distance") / 1000;
			}

		} catch (Exception e) {
			distance = -1;
			log.error("调用高德计算距离出现异常！", e);
		}

		return distance;
	}

	public static void main(String[] args) {

		double distance = getSingleDistance(116.498695, 39.797722, 116.517952, 39.784061);

		System.out.println(distance);

	}

}
